#ifndef __SOCKETFILE_H__
#define __SOCKETFILE_H__

/**
 * @file socketfile.h
 * @brief Structure de donnée associant une socket et un fichier.
 * @author Florian.B
 * @version 0.1
 * @date 16 avril 2012
 *
 */

#include "../tools/list.h"
#include "../tools/charlist.h"
#include "../tools/intlist.h"

/**
 * @struct SocketFile
 * @brief Objet SocketFile
 *
 * SocketFile est un objet permettant d'associer une socket et un fichier. Cela permet lorsqu'un client qui une connexion sans libérer le fichier de le libérer en même temps que la socket.
 */
typedef struct _SocketFile
{
  char *file /*!< Le fichier utilisé. */;
  int socket /*!< La socket de connexion */;
}SocketFile;

/**
 * @fn void initialize_SocketFile(SocketFile *sF, const char *file, const int socket);
 * @brief Fonction d'initialisation d'un SocketFile.
 *
 * @param[in,out] sF Le SocketFile à initialiser.
 * @param file Le nom du fichier.
 * @param socket La socket de connexion.
 */
void initialize_SocketFile(SocketFile *sF, const char *file, const int socket);

/**
 * @fn void initialize_SocketFile(Element *sFDest, const Element sFSrc);
 * @brief Fonction d'initialisation d'un SocketFile.
 *
 * @param[in,out] sFDest Le SocketFile à initialiser.
 * @param sFSrc Le SocketFile à copier.
 */
void create_SocketFile(Element *socketFileDest, const Element sFSrc);

/**
 * @fn void testament_SocketFile(SocketFile *sF)
 * @brief Fonction de libération d'un SocketFile.
 *
 * @param[in,out] sF SocketFile qui sera libérée.
 */
void testament_SocketFile(SocketFile *sF);

/**
 * @fn void delete_SocketFile(Element *sF)
 * @brief Fonction qui détruit un SocketFile
 *
 * @param[in,out] sF Le SocketFile à détruire.
 */
void delete_SocketFile(Element *sF);

/**
 * @fn ListReturn compare_SocketFile(Element sFA, Element sFB)
 * @brief Fonction de comparaison d'un SocketFile sur la socket si le fichier est NULL et inversement, sinon sur les deux champs de SocketFile.
 *
 * @param sFA L'élément A de comparaison.
 * @param sFB L'élément B de comparaison.
 * @return LIST_COMP_EQ si l'elementA et l'elementB sont égaux, LIST_COMP_DIF sinon.
 */
ListReturn compare_SocketFile(Element sFA, Element sFB);

/**
 * @fn ListReturn compareDelete_SocketFile(Element sFA, Element sFB)
 * @brief Fonction de comparaison d'un SocketFile sur la socket si le fichier est NULL et inversement, sinon sur les deux champs de SocketFile.
 *
 * @param sFA L'élément A de comparaison.
 * @param sFB L'élément B de comparaison.
 * @return LIST_COMP_EQ si l'elementA et l'elementB sont égaux, LIST_COMP_DIF sinon.
 */
ListReturn compareDelete_SocketFile(Element sFA, Element sFB);

#endif
